<?php
/**
 * @package zf-test
 * @subpackage Controller
 */

/**
 * @see Error_Controller
 * @package zf-test
 * @subpackage Controller
 */
class IndexController extends Auth_Controller
{
    /**
     * основна дія, відображення списку проектів, форми додавання/редагування
     */
    public function indexAction()
    {
        $projects = new Projects;
        $this->view->projects = $projects->getAll();
        $this->editAction();
    }

    /**
     * дія форми додавання/редагування
     */
    public function editAction()
    {
        $project = $this->_getParam('project');
        $projects = new Projects;
        if ($project != '') {
            try {
                $form = $projects->getProject($project);
            }
            catch (Exception $e) {
                echo $this->view->translate($e->getMessage());
            }
            $this->_helper->layout->disableLayout();
        }
        else
            $form = $projects->createProject();
        if ($this->getRequest()->isPost())
            if ($form->isValid($this->getRequest()->getPost())) {
                $form->save();
                $this->_redirect('/');
            }
            else {
                $this->addError('[NOT_VLID]');
            }
        $this->view->form = $form;
    }
    
    /**
     * дія видалення проекту. повертає 'ok' або текст помилки
     */
    public function delAction() {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();

        $project = $this->_getParam('project');
        try {
            $projects = new Projects;
            $projects->deleteProject($project);
            throw new Exception('ok');
        }
        catch (Exception $ex) {
            echo $this->view->translate($ex->getMessage());
        }
    }
    
    /**
     * дія отримання можливих варіантів продовження шляху
     */
    public function pathCompleteAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();

        $path = $this->_getParam('term');
        $result = array(); 
            $result = glob($path . "*", GLOB_ONLYDIR);
        echo Zend_Json::encode($result);
    }
    
    /**
     * дія перевірки з’єднання до БД
     */
    public function testDbAction() {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
        try {
            try {
                $adapter = ucfirst($this->_getParam('adapter'));
                $class = 'Zend_Db_Adapter_Pdo_' . $adapter;
                $params = array('dbname' => '') + $this->getRequest()->getPost();
                $db = new $class($params);
                echo $this->view->translate('[SUCCESS_CONNECTION]') . $db->getServerVersion();
            }
            catch (Exception $ex) {
                throw new Exception('[ERROR_CONNECTION]');
            }
        }
        catch (Exception $ex) {
            echo $this->view->translate($ex->getMessage());
        }
    }
    
    /**
     * функція отримання коду для перевірки поадльшого прогресу по цьому коду
     */
    public function getCodeAction() {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
        
        try {
            $projects = new Projects;
            $project = $projects->getProject($this->_getParam('project'));
            $tmpDir = realpath($this->config->projects->path) . '/temp/';
            if (!file_exists($tmpDir)) mkdir($tmpDir);

            $do = $this->_getParam('do');
            $code = md5($project->config->alias . mktime() . $do);
            $this->cache()->set('code_' . $code, $project->config->toArray() 
                                               + array('tempPath' => $tmpDir));
            $this->cache()->set('position_' . $code, 0);
            if ($do == 'scan') {
                $directories = $project->getDirectories();
                $files = $project->getFiles($directories);
                $this->cache()->set('files_' . $code, $files);
            }
                
            echo Zend_Json::encode(array('code' => $code));
        }
        catch (Exception $ex) {
            echo Zend_Json::encode(array('error' => $this->view->translate($ex->getMessage())));
        }
    }
    
    /**
     * дія перевірки стану запущених тестів по коду
     * @todo видалити код із сессії
     */
    public function checkTestsAction() {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
        
        try {
            $code = $this->_getParam('code');
            $position = $this->cache()->get('position_' . $code);
            $tmpFile = realpath($this->config->projects->path) . '/temp/' . $code;
            $progress = file_exists($tmpFile) ? file_get_contents($tmpFile) : '';
            echo substr($progress, $position);
            $this->cache()->set('position_' . $code, strlen($progress));
        }
        catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

    /**
     * дія перевірки стану сканування
     */
    public function checkScanAction() {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
        $this->cache();
        
        try {
            $code = $this->_getParam('code');
            $tmpFile = realpath($this->config->projects->path) 
                     . '/temp/' . $code . '.log';
            if (file_exists($tmpFile)) {
                $f = fopen($tmpFile, 'r');
                $position = $this->cache()->get('position_' . $code);
                fseek($f, $position);
                $data = fread($f, 10000);
                echo $data;
                $position += strlen($data);
                $this->cache()->set('position_' . $code, $position);
            }
            else
                echo $tmpFile;
        }
        catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }
}

